home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / awele-1.0 / awele-1 / awele / xawele < prev    next >
Text File  |  1995-12-08  |  17KB  |  492 lines

  1. #!/a/air/alpha-bin/awelewish -f
  2.  
  3. # variables connues de C et de TCL
  4. set levelname "REGULAR"
  5. set awcur "12060000040404040404040404040404"
  6.  
  7. # variables globales a ce script
  8. set awbak "12060000040404040404040404040404"
  9. set level 6
  10. set pris1 3
  11. set pris2 3
  12. set cp 0
  13. for {set i 0} {$i < 12} {incr i} {set aw_cur($i) 4}
  14. set status_str "Welcome to AWELE 1.0"
  15. set firstplay 1
  16.  
  17. # fenetres de regle du jeu
  18. #########################################
  19. #en francais
  20. proc regles {w} {
  21.     toplevel $w
  22.     wm title $w "Regles du jeu"
  23.     message $w.msg -justify left -width 10c -fg palegreen -bg sienna -text "\
  24.     L'AWELE est jeu d'Afrique aussi connu sous le nom de SUNGO.\
  25.     Il se prΘsente sous la forme de deux rangΘes de 6 trous\
  26.     contenant initialement 4 pierres. La rangΘe du bas est votre camp,\
  27.     celle du haut celui de l'adversaire.\
  28.     Le but est de capturer le maximum de pierres.\n\n\
  29.     Mouvements:\n\
  30.     Tour a tour, les joueurs choisissent un trou non vide de leur camp\
  31.     et en repartissent le contenu α raison d'une pierre sur les trous\
  32.     successifs dans l'ordre inverse des aiguilles d'une montre, en \
  33.     omettant systematiquement le trou d'origine.\n\n\
  34.     Prises:\n\
  35.     Si la derniΦre pierre posΘe tombe dans le camp adverse ET dans un\
  36.     trou contenant 2 ou 3 pierres (la pierre posΘe y compris) alors\
  37.     les pierres de ce trou sont faites prisonniΦres et sont enlevΘes\
  38.     du jeu. La prise continue alors en examinant l'avant derniΦre pierre posΘe\
  39.     (etc..) tant que les deux conditions de prise sont verifiΘes. DΦs que\
  40.     celles-ci sont mises en defaut, la prise s'arrΩte.\n\n\
  41.     Fin de partie:\n\
  42.     Si un des joueurs ne peut jouer (son camp est vide),\
  43.     la partie s'arrΩte et il capture toutes les pierres restant dans le camp adverse.\
  44.     Il existe des endroits o∙ l'on considΦre que ce cas de figure est un pat, ce\
  45.     n'est pas la rΦgle implementΘe ici. En gΘnΘral, la partie s'arrΩte\
  46.     quand il n'y a plus assez de pierres pour faire des prises.\
  47.     Ce programme ne dΘtecte pas les fins de partie.\n\n\
  48.     A propos de ce programme: la technique utilisΘe est une recherche\
  49.     de type alpha-beta. Pour jouer, cliquer du 1er bouton sur le trou\
  50.     choisi. Cliquer du bouton 2 vous permet de voir o∙ arrive la derniΦre pierre."
  51.     pack $w.msg -side top
  52.     button $w.ok -text "OK" -command "destroy $w" -relief raised -fg palegreen -bg sienna\
  53.         -activebackground chocolate
  54.     pack $w.ok -side bottom -fill x -expand yes
  55. }
  56.  
  57. #en anglais
  58. proc rules {w} {
  59.     toplevel $w
  60.     wm title $w "Game rules"
  61.     message $w.msg -justify left -width 10c -fg palegreen -bg sienna -text "\
  62.     AWELE is an african game also known as SUNGO.\
  63.     The game board is made up of 2 rows of 6 squares with each\
  64.     square initially containing 4 stones. Your side is the bottom row\
  65.     and your opponent's side is the top row. The aim is to capture as\
  66.     many stones as possible.\n\n\
  67.     Moves:\nPlayers alternate turns. To play, choose a non-empty square in your side\
  68.     and drop its stones (1 each) in each successive squares in a counter clockwise\
  69.     direction. Always skip over the original square.\n\n\
  70.     Captures:\n\
  71.     If you end up your turn by dropping a stone in your opponent's side AND\
  72.     in a square containing 2 or 3 stone (including the stone you dropped in)\
  73.     these stones are captured. Then, continue capturing in each preceding\
  74.     squares as long as those 2 conditions are respected. Captures end as soon as\
  75.     this is no more the case.\n\n\
  76.     End of the game:\n\
  77.     if one of the player can't play at his turn (i.e. his side is empty)\
  78.     he captures all the remaining stones and the game ends. There exist rules where\
  79.     such a situation is declared a draw. This is not the case here.\
  80.     In general, the game ends when there is not enough stones to allow captures.\
  81.     This soft doesn't detect the end of the game.\n\n\
  82.     About the program: an alpha-beta search is used. To play, click with button-1\
  83.     on the square you choosed. Clicking with button-2 on a square indicates where\
  84.     the last stone is dropped."
  85.     pack $w.msg -side top
  86.     button $w.ok -text "OK" -command "destroy $w" -relief raised -fg palegreen -bg sienna\
  87.         -activebackground chocolate
  88.     pack $w.ok -side bottom -fill x -expand yes
  89. }    
  90.  
  91. # CONVERSIONS AWELE TABLEAU <-> STRING
  92. ##########################################
  93. proc awele_get {} {
  94. global pris1
  95. global pris2
  96. global cp
  97. global level
  98. global aw_cur
  99. global awcur
  100.     scan $awcur "%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d" cp level pris1 pris2 aw_cur(0) aw_cur(1) aw_cur(2) aw_cur(3) aw_cur(4) aw_cur(5) aw_cur(6) aw_cur(7) aw_cur(8) aw_cur(9) aw_cur(10) aw_cur(11) 
  101. }
  102.  
  103. proc awele_put {} {
  104. global pris1
  105. global pris2
  106. global cp
  107. global level
  108. global aw_cur
  109. global awcur
  110.     set awcur [format "%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d%02d" $cp $level $pris1 $pris2 $aw_cur(0) $aw_cur(1) $aw_cur(2) $aw_cur(3) $aw_cur(4) $aw_cur(5) $aw_cur(6) $aw_cur(7) $aw_cur(8) $aw_cur(9) $aw_cur(10) $aw_cur(11)]
  111. }
  112.  
  113.  
  114. # ROUTINES DE DISPLAY DE L'AWELE
  115. #############################################################################
  116. # trou i
  117. proc aweletrou { w i } {
  118.     if { $i < 6 } { 
  119.         set x1 [ expr 10 + 110*$i ]
  120.         set x2 [ expr $x1 + 100 ]
  121.         set y1 120
  122.         set y2 220
  123.     } else {
  124.         set x1 [ expr 10 + 110*(11-$i) ]
  125.         set x2 [ expr $x1 + 100 ]
  126.         set y1 10
  127.         set y2 110
  128.     }
  129.     $w create oval $x1 $y1 $x2 $y2 -width 10 -fill sienna -tags "$i trou$i trou thing"
  130. }
  131.  
  132. # place feves de aw_cur dans le trou i
  133. ############################################################################
  134. # trace d'une feve en x,y
  135. proc drawfeve { w x y taglist } {
  136.     set x1 [expr $x-8]
  137.     set y1 [expr $y-8]
  138.     set x2 [expr $x+8]
  139.     set y2 [expr $y+8]
  140.     .c create oval $x1 $y1 $x2 $y2 -fill palegreen -width 1 -outline red -tags $taglist
  141. }
  142.  
  143. # met les feves du trou i
  144. proc putfeve { w i } {
  145. global aw_cur
  146.     set contenu $aw_cur($i)
  147.     if { $contenu > 0 } { putnfeve $w $contenu $i }
  148. }
  149.  
  150. # met n feves dans le trou i    
  151. proc putnfeve { w n i } {
  152.     set taglist "$i feve$i feve thing"
  153.     if { $i < 6 } {
  154.         set xc [expr 60+110*$i]  
  155.         set yc 170
  156.     } else {
  157.         set xc [expr 60+110*(11-$i)]  
  158.         set yc 60
  159.     }
  160.  
  161.     switch $n {
  162.         1 {
  163.             drawfeve $w $xc $yc $taglist
  164.         }
  165.         2 {
  166.             drawfeve $w $xc [expr $yc-20] $taglist
  167.             drawfeve $w $xc [expr $yc+20] $taglist
  168.         }
  169.         3 {
  170.             drawfeve $w $xc [expr $yc-20] $taglist
  171.             drawfeve $w $xc $yc $taglist
  172.             drawfeve $w $xc [expr $yc+20] $taglist
  173.         }
  174.         4 {
  175.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  176.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  177.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  178.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  179.         }
  180.         5 {
  181.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  182.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  183.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  184.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  185.             drawfeve $w $xc $yc $taglist
  186.         }
  187.         6 {
  188.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  189.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  190.             drawfeve $w [expr $xc-20] $yc $taglist
  191.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  192.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  193.             drawfeve $w [expr $xc+20] $yc $taglist
  194.         }
  195.         7 {
  196.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  197.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  198.             drawfeve $w [expr $xc-20] $yc $taglist
  199.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  200.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  201.             drawfeve $w [expr $xc+20] $yc $taglist
  202.             drawfeve $w $xc $yc $taglist
  203.         }
  204.         8 {
  205.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  206.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  207.             drawfeve $w [expr $xc-20] $yc $taglist
  208.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  209.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  210.             drawfeve $w [expr $xc+20] $yc $taglist
  211.             drawfeve $w $xc [expr $yc+10] $taglist
  212.             drawfeve $w $xc [expr $yc-10] $taglist
  213.         }
  214.         9 {
  215.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  216.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  217.             drawfeve $w [expr $xc-20] $yc $taglist
  218.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  219.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  220.             drawfeve $w [expr $xc+20] $yc $taglist
  221.             drawfeve $w $xc [expr $yc+20] $taglist
  222.             drawfeve $w $xc [expr $yc-20] $taglist
  223.             drawfeve $w $xc $yc $taglist
  224.         }
  225.         default {
  226.             if {$n > 0} {
  227.             drawfeve $w [expr $xc-20] [expr $yc-20] $taglist
  228.             drawfeve $w [expr $xc-20] [expr $yc+20] $taglist
  229.             drawfeve $w [expr $xc-20] $yc $taglist
  230.             drawfeve $w [expr $xc+20] [expr $yc-20] $taglist
  231.             drawfeve $w [expr $xc+20] [expr $yc+20] $taglist
  232.             drawfeve $w [expr $xc+20] $yc $taglist
  233.             drawfeve $w $xc [expr $yc+20] $taglist
  234.             drawfeve $w $xc [expr $yc-20] $taglist
  235.             drawfeve $w $xc $yc $taglist
  236.             .c create rectangle [expr $xc-10] [expr $yc-10]\
  237.                 [expr $xc+10] [expr $yc+10] -outline red -fill white -tags $taglist
  238.             .c create text $xc $yc -text $n -fill red -tags $taglist
  239.             }
  240.         }
  241.     }
  242. }
  243. # flash le trou numero i
  244. ##########################################################################
  245. proc flashtrou {w i n color} {
  246.     for {set j 0} {$j<$n} {incr j} {
  247.         $w itemconfigure trou$i -outline $color
  248.         update idletasks
  249.         after 100
  250.         $w itemconfigure trou$i -outline black
  251.         update idletasks
  252.         after 100
  253.     }
  254. }
  255.  
  256.  
  257. # fait le tout
  258. ###########################################################################
  259. proc affichage_trou {w} {
  260.     for {set i 0} {$i <12} {incr i} {
  261.         aweletrou $w $i
  262.     }
  263. }
  264. proc affichage_feve {w} {
  265.     $w delete feve
  266.     for {set i 0} {$i <12} {incr i} {
  267.         putfeve $w $i
  268.     }
  269. }
  270.  
  271. # UNDO
  272. ############################################################################
  273. proc undo {w} {
  274. global awcur 
  275. global awbak
  276. global level 
  277. global levelname
  278.     set awcur $awbak
  279.     awele_get
  280.     setlevel $levelname $awbak
  281.     affichage_feve $w
  282. }
  283.  
  284. # NEWGAME 
  285. ###########################################################################
  286. proc newgame {w initplayer} {
  287. global awcur awbak status_str
  288. global cp
  289. global firstplay
  290. global levelname
  291.     set awcur "12060000040404040404040404040404"
  292.     set awbak "12060000040404040404040404040404"
  293.     setlevel $levelname $awcur
  294.     awele_get
  295.     affichage_feve $w 
  296.     if { $initplayer == 2 } {
  297.         computer_rand_play $awcur
  298.         scan [string range $awcur 0 1] %d cp
  299.         set cp [expr $cp%12]
  300.         showplay $w $cp 2
  301.         awele_get
  302. #        affichage_feve $w
  303.         set status_str "Your turn"
  304.         set firstplay 0
  305.     } else {
  306.         set firstplay 1
  307.     }
  308. }
  309.  
  310. #joue efectivement un coup avec affichage temps reel
  311. proc showplay { w cp who } {
  312. global aw_cur
  313.     flashtrou $w $cp 2 red
  314.     set n $aw_cur($cp)
  315.     $w delete feve$cp
  316.     update idletasks
  317.     set ind $cp
  318.     for {set i 1} {$i <= $n} {incr i} {
  319.         set ind [expr ($ind+1)%12]
  320.         if {$ind == $cp} {set ind [expr ($ind+1)%12]}
  321.         set aw_cur($ind) [expr $aw_cur($ind)+1]
  322.         $w delete feve$ind        
  323.         update idletasks
  324.         putnfeve $w $aw_cur($ind) $ind 
  325.         update idletasks
  326.         after 100
  327.     }
  328.     set ok 1
  329.     if { $who==1 } {
  330.         for {set i $ind} {$i>=6 && $ok==1} {incr i -1} {
  331.             if { $aw_cur($i)==2 || $aw_cur($i)==3 } {
  332.                 .c delete feve$i
  333.                 flashtrou $w $i 2 white 
  334.             } else {
  335.                 set ok 0
  336.             }            
  337.         }
  338.     } else {
  339.         for {set i $ind} {$i<6 && $i>=0 && $ok==1} {incr i -1} {
  340.             if { $aw_cur($i)==2 || $aw_cur($i)==3 } {
  341.                 .c delete feve$i
  342.                 flashtrou $w $i 2 white
  343.             } else {
  344.                 set ok 0
  345.             }            
  346.         }
  347.     }
  348. }
  349.  
  350.  
  351. # ACTIONS DES BOUTONS
  352. ############################################################################
  353. # bouton 1: joue
  354. proc button1action {w x y} {
  355. global awcur awbak
  356. global cp
  357. global firstplay
  358. global status_str
  359. global aw_cur
  360.     set id [$w find closest $x $y]
  361.     set nb [lindex [$w gettags $id] 0]
  362.     awele_get
  363.     if {$nb < 6 && $aw_cur($nb)>0} {
  364.         $w configure -cursor watch
  365.         update idletasks
  366.         set awbak $awcur
  367.         showplay $w $nb 1
  368.         human_play $nb $awcur
  369.         awele_get
  370.         set status_str "thinking ...."
  371.         update idletasks
  372.         if {$firstplay == 1} {
  373.             computer_rand_play $awcur
  374.             set firstplay 0
  375.         } else {
  376.             computer_play $awcur
  377.         }
  378.         scan [string range $awcur 0 1] %d cp
  379.         set cp [expr $cp%12]
  380.         showplay $w $cp 2
  381.         awele_get
  382.         affichage_feve $w
  383.         update idletasks
  384.         set status_str "Your turn"
  385.         $w configure -cursor top_left_arrow
  386.     }
  387. }
  388.  
  389. #bouton 2: flash dernier trou atteint
  390. proc button2action {w x y} {
  391.     set id [$w find closest $x $y]
  392.     set nb [lindex [$w gettags $id] 0]
  393.     set n [ lasttrou $nb ]
  394.     if {$n>=0} {flashtrou $w $n 1 red}
  395. }
  396.  
  397. proc lasttrou { case } {
  398. global aw_cur
  399.     awele_get
  400.     set contenu $aw_cur($case)
  401.     set j [expr $case+$contenu]
  402.     if {$contenu>=12} {incr j}
  403.     if {$contenu>=23} {incr j}
  404.     if {$contenu>=34} {incr j}
  405.     expr $j%12
  406. }    
  407. # WINDOW TREE
  408. #############################################################################
  409. wm title . "AWELE"
  410.  
  411. # MENU BAR
  412. #############################################################################
  413. frame .menu -relief raised -borderwidth 1 -bg chocolate 
  414. pack .menu -side top -fill x
  415. menubutton .menu.file -text "Misc" -menu .menu.file.m \
  416.     -background chocolate -activebackground chocolate
  417. menubutton .menu.level -text "Level" -menu .menu.level.m \
  418.     -background chocolate -activebackground chocolate
  419.  
  420. menu .menu.file.m -background chocolate -activebackground chocolate
  421. .menu.file.m add command -label "New game (you start)" -command "newgame .c 1"\
  422.      -background  chocolate -foreground palegreen \
  423.     -activebackground sienna -activeforeground palegreen
  424. .menu.file.m add command -label "New game (I start)" -command "newgame .c 2" \
  425.      -background  chocolate -foreground palegreen \
  426.     -activebackground sienna -activeforeground palegreen
  427. .menu.file.m add command -label "Rules" -command "rules .ru" \
  428.      -background  chocolate -foreground palegreen \
  429.     -activebackground sienna -activeforeground palegreen
  430. .menu.file.m add command -label "Regles" -command "regles .re" \
  431.      -background  chocolate -foreground palegreen \
  432.     -activebackground sienna -activeforeground palegreen
  433. .menu.file.m add command -label "Quit" -command exit \
  434.      -background  chocolate -foreground palegreen \
  435.     -activebackground sienna -activeforeground palegreen
  436.  
  437. menu .menu.level.m -background chocolate -activebackground chocolate
  438. .menu.level.m add command -label "Beginner" -command "setlevel BEGINNER $awcur" \
  439.      -background  chocolate -foreground palegreen \
  440.     -activebackground sienna -activeforeground palegreen
  441. .menu.level.m add command -label "Novice" -command "setlevel NOVICE $awcur" \
  442.      -background  chocolate -foreground palegreen \
  443.     -activebackground sienna -activeforeground palegreen
  444. .menu.level.m add command -label "Regular" -command "setlevel REGULAR $awcur"\
  445.      -background  chocolate -foreground palegreen \
  446.     -activebackground sienna -activeforeground palegreen
  447. .menu.level.m add command -label "Fair" -command "setlevel FAIR $awcur"\
  448.      -background  chocolate -foreground palegreen \
  449.     -activebackground sienna -activeforeground palegreen
  450. .menu.level.m add command -label "Good" -command "setlevel GOOD $awcur"\
  451.      -background  chocolate -foreground palegreen \
  452.     -activebackground sienna -activeforeground palegreen
  453. .menu.level.m add command -label "Expert" -command "setlevel EXPERT $awcur"\
  454.      -background  chocolate -foreground palegreen \
  455.     -activebackground sienna -activeforeground palegreen
  456.  
  457. pack .menu.file .menu.level -side left
  458. tk_menuBar .menu .menu.file .menu.level
  459.  
  460. # STATUS 
  461. #############################################################################
  462. frame .status -borderwidth 1 -relief sunken 
  463. pack .status -fill x
  464.  
  465. label .status.pp1 -text "Your captures: " -borderwidth 1 -background sienna -foreground palegreen
  466. label .status.p1 -textvariable pris1 -borderwidth 1  -background sienna -foreground palegreen
  467. label .status.pp2 -text "My captures: " -borderwidth 1  -background sienna -foreground palegreen
  468. label .status.p2 -textvariable pris2 -borderwidth 1  -background sienna -foreground palegreen
  469. label .status.stat -textvariable status_str -borderwidth 1 -relief sunken \
  470.     -background chocolate -foreground palegreen 
  471. button .status.undo -text "  UNDO  " -borderwidth 1  -background sienna -borderwidth 1\
  472.     -foreground palegreen -command "undo .c" -relief raised -activebackground chocolate
  473. label .status.llevel -text "Level: " -borderwidth 1  -background chocolate -foreground palegreen
  474. label .status.level -textvariable  levelname -borderwidth 1  -background chocolate -foreground  palegreen
  475. pack .status.pp1 .status.p1 .status.pp2 .status.p2 -side left -fill both    
  476. pack .status.stat -side left -fill both -expand yes
  477. pack .status.level .status.llevel .status.undo -side right -fill both
  478.  
  479. # GRAPHIC WINDOW
  480. #############################################################################
  481. canvas .c -width 670 -height 230 -background chocolate
  482. pack .c -side bottom -fill both
  483.  
  484. # CREATE AWELE
  485. #############################################################################
  486. awele_get
  487. affichage_trou .c
  488. affichage_feve .c
  489. .c bind thing <1> "button1action .c %x %y"
  490. .c bind thing <2> "button2action .c %x %y"
  491.  
  492.